#include "BuscadorArchivos.h"
#include <iostream>
#include <stdio.h>
#include "string.h"
#include "Reg_Arch.h"
#include "SeleccionadorArchivo.h"
#include "Constantes.h"
#include <fstream>
#include <sstream>
#include <list>

extern int alphasort();

// En documentos se guardaŕa en una linea el directorio
BuscadorArchivos::BuscadorArchivos(std::fstream *documentos, Analizador_Sintactico *analiza) {
	std::string aux;
	std::stringstream ss, ss2;
	this->documentos = documentos;
	this->analizador = analiza;

	num_doc = 1;
	num_directorio = 1;
}


/* 1) Scandir hace malloc a char* de los nombres de los directorios y archivos dentro, de un directorio
 * por lo que yo hago delete de esos char*, nose porque en la posición 0 me tira un missmatched free =S
 * 2) Valgrind me dice q me falta otro free, pero nose cuál es, por eso deleteo "archivos", nose si está bien*/

int BuscadorArchivos::buscar(const char *directorio) {
	int contar = 0, pos_nombre = 0, terminos = 0;
	dirent **archivos;
	std::list<std::string> sub_directorios;
	std::list<std::string>::iterator it;
	std::string sub_directorio, archivo, nom_arch_aux;
	bool hay_archivo = false;
	Reg_Arch reg_datos;

	std::stringstream ss;
	// En arch_aux se guarda los términos, luego se ordena una vez q no hay nada para indexar
	std::fstream arch_aux;

	// Obtengo los nombres de los archivos/carpetas de ese directorio
	contar = scandir(directorio, &archivos, Seleccionador_de_Archivo, alphasort);
	/* Si no se encontraron archivos */
	if(contar <= 0) {
		std::cout << "No hay archivos en este directorio" << std::endl;
		return -1;
	}

	for(int i = 0; i < contar; ++i) {
		archivo = archivos[i]->d_name;
		//std::cout << archivo << std::endl;
		if(archivos[i]->d_type == DT_DIR) {
			sub_directorio += directorio;
			sub_directorio += "/";
			sub_directorio += archivo;
			sub_directorios.push_back(sub_directorio);
			//this->buscador(sub_directorio.c_str());
			sub_directorio.clear();
		}
		// Solo archivos txt
		if((archivos[i]->d_type == DT_REG) && (archivo.find(".txt", archivo.size() - 4) != std::string::npos)) {
			nom_arch_aux = ruta_aux;
			nom_arch_aux += "arch_aux";
			ss << num_doc;
			nom_arch_aux += ss.str();
			nom_arch_aux += ".txt";
			hay_archivo = true;
			//std::cout << "Archivo: " << archivo << std::endl;
			arch_aux.open(nom_arch_aux.c_str(), std::ios_base::in| std::ios_base::out| std::ios::trunc);
			terminos = analizador->Analizador(directorio, archivo, num_doc - 1, &arch_aux);
			if(terminos > 0) {
				pos_nombre = documentos->tellg();
				reg_datos.setPeso(terminos);
				reg_datos.setPos(pos_nombre);
				//std::cout << "pos_nombre: " << reg_datos.getPos() << std::endl;
				//std::cout << "Peso: " << reg_datos.getPeso() << std::endl;
				this->datos_arch.write(reinterpret_cast<char *>(&reg_datos), sizeof(reg_datos));
				*documentos << directorio;
				*documentos << "/";
				*documentos << archivo;
				*documentos << " ";
				*documentos << num_doc;
				*documentos << '\n';
				num_doc++;
			}
			ss.str("");
			arch_aux.close();
		}
		archivo.clear();
		//delete archivos[i]; // Nose si va
	}

	for(it = sub_directorios.begin(); it != sub_directorios.end(); it++) {
		this->buscar((*it).c_str());
	}

	arch_aux.close();

	//borrar_archivo();
	//delete archivos; // Nose si va
	//delete analizador;
	return 0;
}

/*
int BuscadorArchivos::obtener_num_max(std::fstream *arch) {
	std::string max_num_doc;
	int max = 0, cont = 0;
	bool mas_digitos = true;
	char aux;
	while(mas_digitos) {
		//arch->clear();
		arch->seekg(-2 - cont, std::ios_base::end);
		*arch >> max_num_doc;
		arch->clear();
		aux = max_num_doc.at(0);
		if((aux > '9') || (aux < '0')) {
			mas_digitos = false;
		}
		std::stringstream ss(max_num_doc.c_str());
		ss >> max;
		max_num_doc.clear();
		cont++;
	}
	//std::cout << "Num max doc " << max << std::endl;
	arch->clear();
	arch->seekg(0, std::ios_base::beg);
	return max;
}*/

// Borra el contenido del archivo
/*int BuscadorArchivos::borrar_archivo(std::fstream *archivo) {
	int tam = 0;
	std::streampos aux = 0;
	if((tam = archivo->tellp()) > 0) {
		//arch_aux.seekp(0, std::ios::beg);
		//remove("archivo_auxiliar.txt");
		//arch_aux = std::ofstream("archivo_auxiliar.txt");
		//arch_aux << "TAM";
	}
	return 0;
}

void BuscadorArchivos::getUltimoDocDir() {
	int tam_docu = 0, tam_direc = 0;
	// debería leer los archivos documentos_temp y directorios para saber sus últimos números
	this->documentos->seekg(0, std::ios_base::end);
	this->directorios->seekg(0, std::ios_base::end);
	tam_docu = this->documentos->tellg();
	tam_direc = this->directorios->tellg();
	if((tam_docu > 0) && (tam_direc > 0)) {
		num_doc = obtener_num_max(this->documentos);
		num_directorio = obtener_num_max(this->directorios);
		num_doc++;
		num_directorio++;
		//std::cout << "num_doc: " << num_doc << std::endl;
		//std::cout << "num_directorio: " << num_directorio << std::endl;
	}
	//this->documentos->seekg(0, std::ios_base::end);
	//this->directorios->seekg(0, std::ios_base::end);
	datos_arch.open(nom_arch_datos_arch, std::ios_base::binary | std::ios_base::in | std::ios_base::out);
	datos_arch.seekg(0, std::ios_base::end);
	if(!datos_arch.is_open())
		datos_arch.open(nom_arch_datos_arch, std::ios_base::binary | std::ios_base::in | std::ios_base::out | std::ios_base::trunc);
}

std::fstream* BuscadorArchivos::getDatosArch() {
	return (&datos_arch);
}

void BuscadorArchivos::vaciarDatos_Arch() {
	datos_arch.close();
	datos_arch.open(nom_arch_datos_arch, std::ios_base::binary | std::ios_base::in | std::ios_base::out | std::ios_base::trunc);
}

void BuscadorArchivos::resetearNum() {
	num_directorio = 1;
	num_doc = 1;
}

int BuscadorArchivos::getNum_Doc() {
	return (num_doc - 1);
}*/

BuscadorArchivos::~BuscadorArchivos() {}

